# -*-coding:utf-8-*-
import numpy as np

"""
数组切片及索引
"""
a1 = np.arange(12)  # [0 1 2 3 4 5 6 7 8 9 10 11]
a2 = a1.reshape((3, 4))  # [[0 1 2 3] [4 5 6 7] [8 9 10 11]]

# 切片索引
s1 = a1[0:6:2]  # [0 2 4]
s2 = a2[0:2, ...]  # [[0 1 2 3] [4 5 6 7]]
s3 = a2[0:1, 0:2]  # [[0 1]]
s4 = a2[..., 0:1]  # [[0] [4] [8]]
s5 = a2[0:2, 1]  # [1 5] 切片索引和整数索引同时使用,a2[0:2,[1]]为[[1] [5]]
s6 = a2[0:2, [1, 2]]  # [[1 2] [5 6]] 切片索引和整数索引同时使用

# 整数索引
i1 = a2[[1, 2]]  # [[4 5 6 7] [8 9 10 11]],等同于a2[[1, 2], ...]
i2 = a2[1]  # [4 5 6 7],等同于a2[1, ...]
i3 = a2[1, 1]  # 5,获取(1,1)位置处的元素
i4 = a2[[0, 1], [2, 3]]  # [2 7],获取(0,2)和(1,3)位置处的元素
i5 = a2[[0, 1], 1]  # [1 5],获取第0,1行中的第1列
i7 = a2[[0, 2]][..., [1, 3]]  # [[1 3] [9 11]],获取第0,2行和第1,3列组成的矩阵

# 布尔索引
x = np.arange(12)  # [0 1 2 3 4 5 6 7 8 9 10 11]
y = np.array([[0, np.NAN, 2, 3], [4, 5, 6, 7], [8, 9, np.NAN, 11]])
z = np.array([0, 1, 2])
b1 = x > 5  # [False False False False False False True True True True True True]
b2 = y > 5  # [[False False False False] [False False True True] [True True False True]]
b3 = z > 0  # [False True True]
b4 = y[z > 0]  # [[4. 5. 6. 7.] [8. 9. nan 11.]],布尔索引取出了布尔值为True的行
b5 = y[y > 5]  # [6. 7. 8. 9. 11.]
b6 = y[~np.isnan(y)]  # [0. 2. 3. 4. 5. 6. 7. 8. 9. 11.],取出不是NAN的元素
b7 = a2[a2[..., 0] > 1]  # 取出第0列元素大于1的行. a2[...,0]>1为[False True True],即取第1,2行 ([[4 5 6 7][8 9 10 11]])
b8 = a2[..., a2[0] > 1]  # 取出第0行元素大于1的列. a2[0]>1为[False False True True],即取第2,3列 ([[2 3][6 7][10 11]])
